package one_one

import (
	"producter_consumer/out"
	"sync"
)

//  一个生产者对应一个消费者的情况

type Task struct {
	ID int64
}

// 运行
func (t *Task) run() {
	out.Println(t.ID)
}

// 定义channel,并给一个缓存为 10
var taskCh = make(chan Task, 10)

const taskNum int64 = 10000

// 生产者,只做写入操作,不做读取
func producer(wo chan<- Task) {
	// 给 channel 写入数据
	var i int64
	for i = 1; i < taskNum; i++ {
		t := Task{
			ID: i,
		}
		wo <- t
	}
	// 因为只有一个生产者,所以生产以后就可以直接关闭通道
	close(wo)
}

// 定义一个消费者
func consumer(ro <-chan Task) {
	// 遍历
	for t := range ro {
		if t.ID != 0 {
			t.run()
		}
	}
}

// Exec 新建两个协程调用
func Exec() {
	// 生产者
	go producer(taskCh)
	// 消费者
	go consumer(taskCh)
}

// ExecWg 下面使用 waitgroup 来处理
func ExecWg() {
	wg := sync.WaitGroup{}
	wg.Add(2) // 这里添加协程的数量
	go func() {
		defer wg.Done()
		producer(taskCh)
	}()

	go func() {
		defer wg.Done()
		consumer(taskCh)
	}()
	// 这里在两个协程执行完成以后就结束wait
	wg.Wait()
	out.Println("执行成功")
}
